package com.uc3m.dsic.gestorZoo;

import java.sql.*;
import java.util.*;

/**
 * En esta clase se encuentran todos las operaciones que tratan principalmente
 * con zoos
 * 
 * @author Rafael Galvez Sanchez
 * @version 1.0
 */
public class GestorZoo {

    /**
     * Dada una ciudad, devuelve todos los zoo de esa ciudad
     *
     * @param ciudad
     *          ciudad donde tienen que estar los zoo
     *
     * @return Un Arraylist con los zoo de esa ciudad
     *
     * @throws Exception si se produce cualquier tipo de error.
     */
    public ArrayList<Zoo> getZooByCiudad(String ciudad) throws Exception {

        GestorZooInterface izoo = new GestorZooAplicacion();
        ArrayList<String> zooList = new ArrayList<String>();
        ArrayList<Zoo> zoo = new ArrayList<Zoo>();
        Zoo z;
        String idZoo;
        String nombreZoo;
        int aforoZoo, entradasZoo;
        String ciudadZoo;
        String paisZoo;
        String idiomaZoo;
        int aux = 0;

        ResultSet rs = izoo.getTabla(GestorZooAplicacion.Tablas.ZOO);

        //recorremos ResultSet de Zoo
        while (rs.next()) {
            //obtenemos la ciudad del zoo actual
            ciudadZoo = rs.getString(3).toUpperCase();
            //si la ciudad obtenida es igual que la pasada por parametro...
            if (ciudadZoo.compareTo(ciudad.trim().toUpperCase()) == 0) {
                //almacenamos en un arrayList la ciudad del zoo
                zooList.add(ciudadZoo);
                idZoo = rs.getString(1).toUpperCase();
                nombreZoo = rs.getString(2).toUpperCase();
                aforoZoo = rs.getInt(4);
                paisZoo = rs.getString(5).toUpperCase();
                idiomaZoo = rs.getString(6).toUpperCase();
                entradasZoo = rs.getInt(7);
                z = new Zoo(idZoo, nombreZoo, ciudadZoo, aforoZoo, paisZoo,
                        idiomaZoo, entradasZoo);
                aux = 1;
                //añadimos zoo al resultado de la operacion
                zoo.add(z);
            }
        }

        if(aux == 0){
            throw new ZooException("No existe ninguna ocurrencia en la " 
                    + "base de datos con la cadena proporcionada");
        }

        return zoo;
    }

    /**
     * Numero de plazas que quedan en cada sala de cada zoo. Ademas, genera
     * informe con los datos correspondientes
     *
     * @return Un array list con todos los aforos totales de todos los zoos
     * @throws ZooException
     * @throws Exception
     */
    public ArrayList<String> getSalaByZoo() throws ZooException, Exception {

        GestorZooInterface izoo = new GestorZooAplicacion();

        ArrayList<String> zooList = new ArrayList<String>();
        ArrayList<String> salaList = new ArrayList<String>();
        ArrayList<String> resultado = new ArrayList<String>();
        ArrayList<Zoo> zoo = new ArrayList<Zoo>();
        ArrayList<Sala> sala = new ArrayList<Sala>();

        Iterator iteradorZoo;

        Sala s;
        Zoo z;

        String idSala, nombreSala, zooSala;
        int aforoSala;

        String idZoo, nombreZoo, ciudadZoo, paisZoo, idiomaZoo;
        int aforoZoo, entradasZoo;

        int numSalas = 0;
        int sumaAforo = 0;
        int aforoTotal = 0;

        //GenerarInformes informe;

        ResultSet rsZoo = izoo.getTabla(GestorZooAplicacion.Tablas.ZOO);
        ResultSet rsSala = izoo.getTabla(GestorZooAplicacion.Tablas.SALA);

        while (rsZoo.next()) {
            //se obtiene el identificador del Zoo
            idZoo = rsZoo.getString(1).toUpperCase();
            //almacenamos en un arrayList las claves del Zoo
            nombreZoo = rsZoo.getString(2).toUpperCase();
            aforoZoo = rsZoo.getInt(4);
            ciudadZoo = rsZoo.getString(3).toUpperCase();
            paisZoo = rsZoo.getString(5).toUpperCase();
            idiomaZoo = rsZoo.getString(6).toUpperCase();
            entradasZoo = rsZoo.getInt(7);
            z = new Zoo(idZoo, nombreZoo, ciudadZoo, aforoZoo, paisZoo,
                    idiomaZoo, entradasZoo);
            zoo.add(z);
            zooList.add(idZoo);
            zooList.add(nombreZoo);
            zooList.add(String.valueOf(aforoZoo));
        }

        iteradorZoo = zooList.iterator();

        while (iteradorZoo.hasNext()) {
            idZoo = (String) iteradorZoo.next();
            nombreZoo = (String) iteradorZoo.next();
            aforoZoo = Integer.valueOf((String) iteradorZoo.next());
            resultado.add("Zoo: "+idZoo+"\n");
            //recorremos el ResultSet de Zoo
            while (rsSala.next()) {
                //se obtiene la clave de Zoo de sala
                zooSala = rsSala.getString(4).toUpperCase();
                salaList.add(zooSala);
                //si el id de Zoo y la clave de Zoo en Sala son iguales...
                if (zooSala.compareTo(idZoo) == 0) {
                    numSalas++;

                    //almacenamos en un arrayList las claves de la Sala
                    idSala = rsSala.getString(1).toUpperCase();
                    aforoSala = rsSala.getInt(2);
                    nombreSala = rsSala.getString(3).toUpperCase();
                    s = new Sala(idSala, aforoSala, nombreSala, zooSala);
                    resultado.add("   En el zoo "+idZoo);
                    resultado.add(" está la sala "+idSala+"\n");
                    sala.add(s);
                    //si el aforo de la sala es mayor que el del zoo...
                    if (aforoSala > aforoZoo) {
                        //Error, eso no puede darse
                        throw new ZooException("Error semantico. El aforo" +
                                " del Zoo " + nombreZoo + " es menor que " +
                                "el aforo de una de sus salas.");
                    } else {
                        //Sumamos el aforo de todas las salas de ese zoo.
                        sumaAforo = sumaAforo + aforoSala;
                    }
                }
            }
            /**
             * El aforo total de un zoo sera su aforo menos la suma de los
             * aforos de sus salas
             */
            aforoTotal = aforoZoo - sumaAforo;
            sumaAforo = 0;
            resultado.add(String.valueOf(aforoTotal));
            rsSala.first();
        }
        return resultado;
    }

    /**
     * Obtiene el resultado concreto de la base de datos proporcionado por un
     * identificador de zoo
     *
     * @param id_sala_ticket
     *          Identificador del zoo
     * @return Fila con todos los campos que coinciden con la clave proporcionada
     * @throws ZooException
     * @throws Exception
     */
    public Zoo getZoobyId(String id_sala_ticket) throws ZooException, Exception {

        ResultSet rstemp;
        Zoo nuevo_zoo = null;

        String idZoo,
                nombreZoo, ciudadZoo, paisZoo, idiomaZoo;
        int aforoZoo, entradasZoo;

                   GestorZooInterface gtemp = new GestorZooAplicacion();
            rstemp = gtemp.getTabla(GestorZooAplicacion.Tablas.ZOO);

            while (rstemp.next()) {
                idZoo = rstemp.getString(1).toUpperCase();
                if (id_sala_ticket.trim().toUpperCase().equals(idZoo.trim())) {
                    nombreZoo = rstemp.getString(2).toUpperCase();
                    ciudadZoo = rstemp.getString(3).toUpperCase();
                    aforoZoo = rstemp.getInt(4);
                    paisZoo = rstemp.getString(5).toUpperCase();
                    idiomaZoo = rstemp.getString(6).toUpperCase();
                    entradasZoo = rstemp.getInt(7);
                    nuevo_zoo = new Zoo(idZoo, nombreZoo, ciudadZoo, aforoZoo,
                            paisZoo, idiomaZoo, entradasZoo);
                    break; //salimos, solo puede haber una id_sala unico

                }


            }

        return nuevo_zoo;
    }
}



